package com.mcg.ash;


import com.mcg.plugin.omcxdb.Omcx;
import org.apache.commons.io.IOUtils;
import org.apache.commons.net.telnet.TelnetClient;
import sun.nio.cs.ext.GBK;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;


public class TelnetTool {
    private TelnetClient telnet = new TelnetClient();
    private PrintStream out;
    private InputStream in;
    private char prompt = '$';
    public InputStreamReader inre;
    public InputStream inputStream;
    public DataInputStream  dataInputStream;
    BufferedReader br = null;
    BufferedWriter bw = null;

    // 闁哄拋鍣ｉ敓鑺ユ皑閺併倝骞嬫搴ｆ尝闁哄鎷�
    public void runOmc(String ip, int port, String user, String password, String fileName) {
        try {
            telnet.connect(ip, port);
            System.out.println("telnet执行");

            out = new PrintStream(telnet.getOutputStream(), false, "utf-8");

            // 闁哄秷顫夊畵涔簅ot闁烩偓鍔嶉崺娑氭媼閸撗呮瀭缂備焦鎸诲顐ょ箔閿燂拷
            this.prompt = user.equals("root") ? '#' : '$';
            in = telnet.getInputStream();
            inre = new InputStreamReader(in, "gbk");
            Thread.sleep(5000);
            write(user);
            write(password);
            System.out.println("OMC登陆成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void sendCommand(String command) {
        try {
            System.out.println("开始输入命令: ");
            write(command);
            System.out.println("输入完毕");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public byte[] du() throws Exception{
        String in = readUntil("--------------------END");
        String[] one = {"[D\u001B", "...... \b \b|\b \b\b \b\b \b\b \b\b \b\b \b\b \b"};
        String[] two = {"\u001B[2K\u001B[D", "\u001B[2K\u001B[A\u001B[2K"};

        return tihuan(in, one, two).getBytes("GB2312");
    }

    public String tihuan(String in, String[] one, String[] two) {
        for (String a : one) {
            in = in.replace(a, "");
        }
        for (String b : two) {
            in = in.replace(b, System.getProperty("line.separator"));
        }
        return in;
    }


    public void write(String value) {
        try {
            out.println(value);
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public void disconnect() {
        try {
            System.out.println("开始断开");
            telnet.disconnect();
            System.out.println("已断开");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

//    public String readUntil(String pattern) throws Exception{
//        InputStream aaa = telnet.getInputStream();
//
//        return IOUtils.toString(aaa);
//    }

//    public String readUntil(String pattern) {
//        try {
//
//            br = new BufferedReader(new InputStreamReader(telnet.getInputStream(), "UTF-8")); // 编码写对
//            bw = new BufferedWriter(new OutputStreamWriter(System.out));
//            StringBuilder sb = new StringBuilder();
//            String line = null;
//            while ((line = br.readLine()) != null) {
//                sb.append(line);
//            }
//            bw.flush();
//            return sb.toString();
//        } catch (Exception ex) {
//
//        } finally {
//            if (br != null) {
//                try {
//                    br.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//
//            if (bw != null) {
//                try {
//                    bw.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//            }
//        return null;
//    }


    public String readUntil(String pattern) {
        try {
            char lastChar = pattern.charAt(pattern.length() - 1);
            StringBuffer sb = new StringBuffer();


            char ch = (char) inre.read();
//            System.out.print(ch);
            while (true) {
                sb.append(ch);
                if (ch == lastChar) {
                    if (sb.toString().endsWith(pattern)) {
                        return sb.toString();
                    }
                }
                ch = (char) inre.read();
//                System.out.print(ch);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    public static void main(String[] args) {
//        List<String> a = TelnetTool.readTxt("C:\\ash\\wechat\\WeChat Files\\zhangfan9057\\FileStorage\\File\\2021-07\\删除小区指令.txt");
//        for (String string :a){
//            System.out.println("输出："+string);
//        }
        String a = "RELEASE MUTEXRIGHT:SUBNET=\"320605\",NE=\"348957\";";
        String b = "QUICKDELETECELLFDD:SUBNETWORK=321215,MEID=320605,CELLLOCALID=348957,LEVEL=DEFAULT;";
        String c = "CREATE:MOC=\"ECellEquipmentFunction\",MOI=\"SubNetwork=320605,MEID=348957,ENBFunctionFDD=348957,ECellEquipmentFunction=12\",ATTRIBUTES=\"anttoPortMap=\\\"0;15;15;1;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15\\\",rfAppMode=0,cpId=0,ref1SdrDeviceGroup=\\\"SubNetwork=320605,MEID=348957,ConfigSet=0,Equipment=1,Rack=59,SubRack=1,Slot=1,PlugInUnit=1,SdrDeviceGroup=1\\\",ECellEquipmentFunction=12,cpTransTime=0,aasTiltUl=0,cpTransPwr=49.9,dynBCWeightSwitch=0,refBpDevice=\\\"SubNetwork=320605,MEID=348957,ConfigSet=0,Equipment=1,Rack=1,SubRack=1,Slot=8,PlugInUnit=1,SdrDeviceGroup=1,BpDeviceSet=1,BpDevice=1\\\",refRfDevice=\\\"SubNetwork=320605,MEID=348957,ConfigSet=0,Equipment=1,Rack=59,SubRack=1,Slot=1,PlugInUnit=1,SdrDeviceGroup=1,RfDeviceSet=1,RfDevice=1;SubNetwork=320605,MEID=348957,ConfigSet=0,Equipment=1,Rack=59,SubRack=1,Slot=1,PlugInUnit=1,SdrDeviceGroup=1,RfDeviceSet=1,RfDevice=4\\\",dynBaseBandPoolSwch=0,rruCarrierNo=0,cpSpeRefSigPwr=15.2,anttoCSIRSPortMap=\\\"0;15;15;1;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15\\\",bplType=255,aasTiltDl=0,maxCPTransPwr=47.7,rRUGroupNo=\\\"15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15;15\\\",upActAntBitmapSeq=\\\"1;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0\\\",lnShareBB=0,antMapDlSeq=\\\"1;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0\\\",antMapUlSeq=\\\"1;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0\\\",dlTransInd=1\",EXTENDS=\"\";";
        String ss = chai(c);
        System.out.println(ss);
    }

public static String chai(String in) {
        if (in.contains("SUBNETWORK=")){
            return in.split("SUBNETWORK=")[1].split(",")[0];
        }else if(in.contains("SUBNET=\"")){
            return in.split("SUBNET=\"")[1].split("\"")[0];
    }else if(in.contains("SubNetwork=")){
            return in.split("SubNetwork=")[1].split(",")[0];
        }else if(in.contains("POS=\"")){
            return in.split("POS=\"")[1].split("\"")[0];
        }else {
            return null;
        }
}

    public static Map<String, byte[]> zhu(String filePath, Map<String, String> mm, Omcx omc) throws Exception {
        List<String> a = TelnetTool.readTxt(filePath);
        assert a != null;
        Map<String, byte[]> map = new LinkedHashMap<>();
        System.out.println("开始执行ash");
        String ip = omc.getIp();
        int port = Integer.parseInt(omc.getOmcport());
        String user = omc.getOmcusr();
        String password = omc.getOmcpwd();
        int i = 1;
        TelnetTool telnet = new TelnetTool();
        telnet.runOmc(ip, port, user, password, null);
        System.out.println("切网元");
        Thread.sleep(1000);
        telnet.sendCommand("set amo:moi=" + mm.get(chai(a.get(0))));
        for (String tt : a) {
            System.out.println("开始倒计时");
            Thread.sleep(1000);

            telnet.sendCommand(tt);
            System.out.println("输入指令"+tt);
//            Thread.sleep(10000);

        }
        Thread.sleep(5000);
        telnet.sendCommand("--------------------END");
        System.out.println("指令结束");
        byte[] aaa = telnet.du();
        telnet.disconnect();
        map.put("("+i+")", aaa);
        i++;
//            System.out.println(map);
        System.out.println("end ...");
        return map;
    }

    public static Map<String, byte[]> zhumap(String filePath, Map<String, String> mm, Omcx omc) throws Exception {
        List<String> a = TelnetTool.readTxt(filePath);
        assert a != null;
        Map<String,List<String>> codemap=codemap(a);
        Map<String, byte[]> map = new LinkedHashMap<>();
        System.out.println("开始执行ash");
        String ip = omc.getIp();
        int port = Integer.parseInt(omc.getOmcport());
        String user = omc.getOmcusr();
        String password = omc.getOmcpwd();
        TelnetTool telnet = new TelnetTool();
        for(List<String> list:codemap.values()) {
            telnet.runOmc(ip, port, user, password, null);
            String subnet = chai(list.get(0));
            System.out.println("切网元");
            Thread.sleep(1000);
            telnet.sendCommand("set amo:moi=" + mm.get(subnet));
            for (String tt : list) {
                System.out.println("开始倒计时");
                Thread.sleep(1000);

                telnet.sendCommand(tt);
                System.out.println("输入指令" + tt);
//            Thread.sleep(10000);

            }
            Thread.sleep(5000);
            telnet.sendCommand("--------------------END");
            System.out.println("指令结束");
            byte[] aaa = telnet.du();
            telnet.disconnect();
            map.put(subnet, aaa);
        }
//            System.out.println(map);
        System.out.println("end ...");
        System.out.println("---------------开始打印结果：-----------------");
        for (byte[] bytes :map.values()){
//            String encoding = GetByteEncode.getEncoding(bytes);
//            System.out.println(encoding);
            System.out.println(new String(bytes));
        }
        return map;
    }

  public static Map<String,List<String>> codemap(List<String>codeList){
      Map<String,List<String>> map = new LinkedHashMap<>();
      List<String> subnetList = new ArrayList<>();
      assert codeList != null;
      for (String s : codeList) {
          String subnet = chai(s);
          if (!subnetList.contains(subnet))
              subnetList.add(subnet);
      }
      for (String subnet:subnetList){
          List<String> ll = new ArrayList<>();
          for (String code :codeList){
              String ss = chai(code);
              if (Objects.equals(ss, subnet)){
                  ll.add(code);
              }
          }
          map.put(subnet,ll);
      }
       return map;
  }



    public static List<String> readTxt(String txtPath) {
        File file = new File(txtPath);
        if (file.isFile() && file.exists()) {
            try {
                List<String> list = new ArrayList<>();
                FileInputStream fileInputStream = new FileInputStream(file);
                InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,StandardCharsets.UTF_8);
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

                String text = null;
                while ((text = bufferedReader.readLine()) != null) {
                    list.add(text);
                }
                return list;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}